"""
应用生命周期事件 - 专业部署必备

【核心优化】将初始化逻辑移入 startup 事件
✅ 确保在 uvicorn 启动时正确初始化
✅ 支持优雅关闭
✅ 与部署方式完全解耦
"""
import logging
import asyncio
import random
from fastapi import FastAPI


logger = logging.getLogger("LifeCycle")

async def startup_event():
    """
    应用启动事件 - 替代原来的 __main__ 块
    
    执行顺序:
    1. 初始化QMT客户端 (单例)
    2. 初始化策略管理器 (单例)
    3. 预热核心组件
    
    优势:
    - 与启动方式完全解耦
    - 确保在接收请求前完成初始化
    - 支持异步初始化
    """
    logger.info("🚀 启动量化交易系统 (专业部署版)...")
    
    # 1. 初始化QMT客户端
    from core.qmt_client import qmt_client
    logger.info(f"✅ QMT客户端初始化完成 (实例ID: {id(qmt_client)})")
    
    # 2. 初始化策略管理器
    from core.strategy_manager import strategy_manager
    logger.info(f"✅ 策略管理器初始化完成 (实例ID: {id(strategy_manager)})")
    
    # 3. 【可选】启动行情推送模拟器 (仅用于演示)
    asyncio.create_task(simulate_market_data())
    
    logger.info("🎉 系统启动完成! API文档: http://localhost:9012/docs")

async def shutdown_event():
    """
    应用关闭事件 - 优雅停止
    
    执行顺序:
    1. 停止所有运行中的策略
    2. 释放QMT资源
    3. 保存状态 (可选)
    """
    logger.info("🛑 开始关闭量化交易系统...")
    
    # 1. 停止所有策略
    from core.strategy_manager import strategy_manager
    await strategy_manager.cleanup()
    
    # 2. 【可选】保存系统状态
    
    logger.info("✅ 系统已优雅关闭")

def register_startup_event(app: FastAPI):
    """注册启动事件"""
    @app.on_event("startup")
    async def on_startup():
        await startup_event()

def register_shutdown_event(app: FastAPI):
    """注册关闭事件"""
    @app.on_event("shutdown")
    async def on_shutdown():
        await shutdown_event()

async def simulate_market_data():
    """
    模拟行情数据推送 - 仅用于演示
    
    在真实环境中，这应该由QMT的回调函数触发
    """
    logger.info("📊 启动模拟行情推送器...")
    
    from core.strategy_manager import strategy_manager
    from core.qmt_client import qmt_client
    
    # 模拟股票列表
    symbols = ["SH600000", "SZ000001", "SH600519", "SZ002594", "SH603937"]
    
    try:
        while True:
            await asyncio.sleep(1)  # 每秒推送一次
            
            for symbol in symbols:
                # 1. 获取模拟数据
                data = qmt_client.get_current_data(symbol)
                
                # 2. 分发给策略管理器
                await strategy_manager.on_tick(symbol, data)
                
                # 3. 【可选】日志输出 (降低频率)
                if random.random() < 0.1:  # 10%概率输出
                    logger.debug(f"⚡ 推送模拟行情: {symbol} @ {data['last_price']:.2f}")
    
    except asyncio.CancelledError:
        logger.info("⏹️ 模拟行情推送器已停止")
    except Exception as e:
        logger.error(f"❌ 模拟行情推送器异常: {str(e)}", exc_info=True)